/**
 * Модуль редактирования настроек
 */
(function() 
{
var plugin = {	
	/**
	 * Описания
	 */
	name: 'settings',
	title: 'Настройки',
	desc: 'Конфигуратор vkPatch',
	
	settings: {
		bool:      {category:'settings_test', def:true},
		num:       {category:'settings_test', def:200, min:1, max:500},
		floatNum:  {category:'settings_test', def:200, min:1, max:500, isFloat:true},
		str:       {category:'settings_test', def:'Test string'},
		list:      {category:'settings_test', def: 'two', list:['one','two','three','withoutTranslation']},
		buttonPluginMethod: {buttonHandler: 'buttonPluginMethodTest', category:'settings_test'},
		buttonInlineMethod: {buttonHandler: function(){alert('buttonInlineMethod ok');}, category:'settings_test'},
	},
	
	resources: 
	{
		tabIcon: '',
		rabbit: ''
	},
	
	lang:
	{
		settings: {
			bool: ['Булев параметр','Подсказка булева параметра'],
			num: ['Целый параметр','Интервал от 1 до 500, целое число'],
			floatNum: ['Числовой параметр','Интервал от 1 до 500'],
			str:  ['Строковой параметр','Подсказка строкового параметра'],
			list: ['Список',{one: 'Один', two:'Два', three:'Три'}],
			buttonPluginMethod: 'Метод плагина',
			buttonInlineMethod: 'Собственный метод'
		},
		
		categories: 
		{
			settings_test: 'Секция тестовых настроек'
		},
		
		tabTitle: 			'В +'  /* сумма (&#8512;), звёздочка (&#9733;), молоточки (&#9874;) */,
		saved: 				'Настройки сохранены',
		nothingShow: 		'Нет параметров для отображения',
		version:			'Версия',
		homePage:			'Группа ВКонтакте',
		author:				'Автор',
		debugMode:			'режим отладки',
		donate:				'Яндекс.Деньги'
	},
	
	events: 
	{
		tabActivated: null
	},
	
	pages: 
	{
		'settings': function()
		{
			var tabImg = $('<img>').attr('src', this.resources.tabIcon).css('margin','-2px 0px -4px 0px').css('height','16px');
			this.tab = vkPatch.iface.addTab(tabImg, $('#content > div.tBar:first > ul,#content > div.tabs:first > ul'),this.settingsHash).click(jQuery.proxy(this.tabClickHandler,this));

			// если в адрее указан ?show=vkpatch
			if (vkPatch.page.params.show == 'vkpatch') 
			{
				this.activateTab();
			}
			else
			{
				// Если в адресе есть #vkpath, то активируем вкладку
				this.checkHash();
			};
			
		}
	},
	
	init: function()
	{
		vkPatch.events.pluginInitialized.bind(function(pluginName, plugin)
		{
			if (plugin.settings && $('#vkPatchSettings').length)
			{
				this.showTabContent();
			}
		}, this);
	},
	
	// тег страницы настроек
	settingsHash: '#vkpatch',
	
	/**
	 * Содержание
	 */
	
	// ссылка на вкладку
	tab: null,
	
	// содержание вкладки
	tabContainer: null,
	
	// элемент, в который добавляется содержимое категории
	categoryContainer: null,
	
	/*
	 * Активация вкладки по хешу
	 */
	checkHash: function()
	{
		if (location.hash == this.settingsHash)
		{
			this.activateTab();
		};
	},
	
	buttonPluginMethodTest: function()
	{
		alert('buttonPluginMethod ok');
	},
	
	tabClickHandler: function(e,data)
	{
		// временный фикс для вкладки
		// если находимся на новой вкладке, то перезагружаемся в старую
		// в старых вкладках есть .php в конце, в новых - нет
		/*if (! /\.php$/.test(location.pathname) )
		{
			location.href = 'http://'+location.host+'/settings.php'+this.settingsHash;
			e.preventDefault();
			return false;
		};*/

		// отменяем обработчик события поумолчанию
		// чтобы IE не брал страницу из кеша
		e.preventDefault();
		vkPatch.page.hash(this.settingsHash);
		this.activateTab();
	},
	
	/*
	 * Активируем вкладку
	 */
	activateTab: function()
	{
		// активируем вкладку
		vkPatch.iface.activateTab(this.tab);
				
		vkPatch.page.add(['ui_controls.css','privacy.css', 'ui_controls.js','privacy.js'],jQuery.proxy(this.showTabContent,this));
	},
	
	/*
	 * Содержимое вкладки
	 */
	showTabContent: function()
	{
		/*
		 *  Колбек, который вызывается при выборе элемента списка
		 */
		cur.onPrivacyChanged = function(key)
		{
			var value = window.Privacy.getValue(key);
			// значение выпадающего списка представляет собой величину вида: -1_1_[значение выбранного элемента]_
			// извлечём
			value = value.substring(5, value.length-1)
			$('#'+key).val(value);
		};

		// Удаляем сообщения
		$('#content > div > div.msg').parent().remove();
		
		// очищаем страницу и подготавливаем форму
		this.tabContainer = $('#content').children('div.tabs').nextAll().remove().end().end().append('<div id="settings_result" style="display: block; "></div><div id="settings_panel" class="clear_fix"><form mathod="get" action="#" name="vkPatchSettings" id="vkPatchSettings"></form></div>').find('form');
		// Нечего отображать
		var nothingShow = true;
		this.tabContainer.append(this.aboutPanel());
		nothingShow = false;
		
		for (var categoryName in vkPatch.settings.categories)
		{
			if (!vkPatch.settings.categories.hasOwnProperty(categoryName)) continue;
			
			// пропускаем скрытые настройки
			if (categoryName == 'hidden') continue;
			// отключаем тестовую секцию, если не в режиме отладки
			if (categoryName == 'settings_test' && !vkPatch.debug) continue;
			
			nothingShow = false;
			
			var category = vkPatch.settings.categories[categoryName];

			if (category.length > 0)
			{
				this.categoryContainer = $('<div class="settings_section"></div>');
				this.categoryContainer.append('<h2>'+(vkPatch.lang.categories[categoryName]||categoryName)+'</h2>');
				this.tabContainer.append(this.categoryContainer);
			}
			
			for (var i=0; i < category.length; i++)
			{
				var option = category[i];
				var type = option.getType();

				switch (type)
				{
					case vkPatch.settings.TYPE_STRING:
						
						this.stringParam(option);
						
						break;
						
					case vkPatch.settings.TYPE_BOOL:
						
						this.booleanParam(option);
						
						break;
						
					case vkPatch.settings.TYPE_INT:
					case vkPatch.settings.TYPE_FLOAT:
						
						this.numberParam(option);
						
						break;
						
					case vkPatch.settings.TYPE_LIST:
							
						this.listParam(option);
						
						break;
						
					case vkPatch.settings.TYPE_BUTTON:
					
						this.buttonParam(option);
						
						break;
						
					case vkPatch.settings.TYPE_PANEL:
						
						this.panelParam(option);
						
						break;
				};
				
			};
			
		};
		
		if (nothingShow) 	/* нет параметров для отображения */
		{
			vkPatch.iface.inlineMessage(this.lang.nothingShow).insertBefore('#content > div.editorPanel');
		}
		else
		{
			// Кнопка "сохранить"
			this.button('Сохранить', jQuery.proxy(this.save,this));	
		};
		
		this.events.tabActivated.raise();
	},
	
	/*
	 * Сохранение параметров
	 */
	save: function()
	{
		var serializedForm = $('#vkPatchSettings').serializeArray();

		for (var i=0; i<serializedForm.length; i++)
		{
			vkPatch.settings.container[serializedForm[i].name].set(serializedForm[i].value);
			$('#'+serializedForm[i].name).val(vkPatch.settings.container[serializedForm[i].name].get());
		}

		
		// Выводим сообщение
		this.showMessage(this.lang.saved, 'normal');

		// Прокручиваем страницу наверх
		$(window).scrollTop(0);
	},
	
	/**
	 * Вывести сообщение вверху панели
	 * @param {string} message
	 * @param {string} [type=normal] - error или normal
	 * @param {integer} [delay=4000] - время показа сообщения в мс, -1 - не скрывать
	 */
	showMessage: function(message, type, delay) 
	{
		delay = delay || 4000;

		$('#settings_result').empty();	// удаляем старое
		switch (type)
		{
			case 'error':
				var messageElement = vkPatch.iface.inlineError(message);
			break;
			
			case 'normal':
			default:
				var messageElement = vkPatch.iface.inlineMessage(message);
		}
		
		messageElement.appendTo('#settings_result');
		
		/* скрываем через заданный интервал */
		if (delay > 0) 
		{
			messageElement.delay(delay).slideUp('slow');
		};
	},
	
	/*
	 * Строковой параметр
	 */
	stringParam: function(option)
	{
		var title = option.title;
		var desc = option.desc || '';
		
		var label = $('<div style="display: inline-block; width: 200px;">'+title+':</div>');
		var input = $('<div style="display: inline-block;"><input type="text" class="text" id="'+option.name+'" name="'+option.name+'" value="'+option.get()+'" /></div>');
		
		var container = $('<div style="margin: 4px 0px"></div>').append(label).append(input);
		this.categoryContainer.append(container);
		
		// вешаем подсказку
		if (option.desc) 
		{
			vkPatch.iface.tooltip('balloon', label, option.desc);
		};
		
	},
	
	/*
	 * Булевский параметр
	 */
	booleanParam: function(option)
	{
		
		// Добавляем строку параметра
		var checked = option.get() ? 1 : 0;
		var wrapper = $('<div id="'+option.name+'_wrapper" class="settings_service_row clear_fix">');
		var hidden = $('<input type="hidden" id="'+option.name+'" name="'+option.name+'" />').val( checked );
		wrapper.append(hidden);
		
		var checkbox = $('<div class="checkbox fl_l" onclick="checkbox(this);" name="checkbox_'+option.name+'"><div></div>'+option.title+'</div>');
		if (checked)
		{
			checkbox.addClass('on');
		};
		
		var optionName = option.name;
		wrapper.append(checkbox);
		
		this.categoryContainer.append(wrapper);
		checkbox.click(function()
		{
			$('#'+optionName).val(window.isChecked(this));
		});
		
		var input = window.ge(option.name);
		
		// Функцией ВКонтакте, преобразуем флажок
		//new window.Checkbox(input, {checked: option.get(), label: option.title,  onChange: function() { }});
		
		if (option.desc)
		{
			vkPatch.iface.tooltip('balloon', checkbox, option.desc, -25);
		}
	},
	
	/*
	 * Число
	 */
	numberParam: function(option)
	{
		// Поле выглядит так-же, как и строковой параметр
		this.stringParam(option);
	},
	
	
	/*
	 * Список
	 */
	listParam: function(option)
	{

		// Выбранный вариант
		var selected = option.get();

		// Название выбранного варианта
		var selected_title = selected;
		var selected_index = 0;
		
		
		var desc = {};
		// Если не определены описания
		if (option.desc === null)
		{
			option.desc = {};
		};

		// получаем названия вариантов
		for (var i=0; i<option.list.length; i++)
		{
			// Из описания или если нет, то берём просто имя
			var title = option.desc[option.list[i]] || option.list[i];
			
			
			desc[option.list[i]] = title;
			
			// Нашли выбранный
			if (option.list[i] == selected)
			{
				selected_index = i;
				selected_title = title;
			}
		}
	

		this.categoryContainer.append('<div style="margin: 4px 0px"><div style="display: inline-block; width: 200px">'+option.title+':</div><div class="settings_privacy_control" style="display: inline-block;padding: 4px;"><a id="privacy_edit_'+option.name+'" style="cursor: pointer;" onclick="return Privacy.show(this, event, \''+option.name+'\');">'+selected_title+'</a><span></span></div><input type="hidden" id="'+option.name+'" name="'+option.name+'" value="'+selected+'"/></div>');
		if (!window.cur.privacy)
		{
			window.cur.privacy = {};
		};
				
		window.cur.privacy[option.name + '_types'] = desc;
		window.cur.privacy[option.name] = [selected];
	},
	
	/**
	 * Вывести параметр-кнопку
	 * @param {object} option - описание параметра из vkPatch.settings.
	 */
	buttonParam: function(option) 
	{
		this.button(option.title, option.buttonHandler, option.name, option.desc, 'gray');		
	},
	
	/**
	 * Вывести кнопку на панель настроек
	 * @param {string} label - текст кнопки
	 * @param {function} handler - обработчик нажатия
	 * @param {string} [id] - id кнопки
	 * @param {string} desc - описание
	 */
	button: function(label, handler, id, desc, color) 
	{
		var button = vkPatch.iface.button(label, handler, id, color);
		// посказка
		if (desc) 
		{
			vkPatch.iface.tooltip('balloon', button, desc);
		};
		
		this.categoryContainer.append( 
			$('<div>').css(
				{
					'text-align': 'center',
					'margin': '5px 0px',
					'clear': 'both'
				})
			.append( button )
		);
	},
	
	/**
	 * Вывести панель
	 * @param {object} option - описание параметра
	 */
	panelParam: function(option) 
	{
		if (_.isFunction(option.panel))
		{
			var panel = option.panel();
		}
		else
		{
			panel = option.panel;
		};
		
		this.categoryContainer.append(panel);
	},
	
	aboutPanel: function() 
	{
		var debug = vkPatch.debug ? ' <small>[' + this.lang.debugMode + ']</small>' : '';
		return $.nano('<div class="settings_section" style="color: #555"><img src="'+this.resources.rabbit+'" style="float: left; margin-bottom: 10px; margin-right: 30px;"><h4 style="color: #555; margin-bottom: 8px; padding-top: 6px;">vkPatch'+debug+'</h4>{version}: '+vkPatch.version+'<br>{homePage}: <a href="http://vk.com/vkpatch">http://vk.com/vkpatch</a><br>{author}: <a href="http://vk.com/pochemuto">Сергей Третьяк</a><br>{donate}: <b>41001936638703</b></div>', this.lang);
	}
		
};

vkPatch.plugins.add(plugin);
})();